package com.hh.erp.config;

import com.hh.erp.util.JsonUtil;
import com.hh.erp.util.StringUtil;
import com.hh.erp.util.http.AjaxResult;
import com.hh.erp.util.http.Constants;
import com.hh.erp.util.http.DiscoveryException;
import com.mysql.cj.jdbc.exceptions.CommunicationsException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import java.sql.SQLSyntaxErrorException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;


/*
   因为有使用到 WebMvcConfigurer 拦截器去控制权限问题，原来抛出异常的json 返回前端变成了html 数据
   所以再使用给了这个注解类，可以将所有抛出的异常转为 JSON 返回给前端
 */
@ControllerAdvice
@Slf4j
public class ExceptionConfig {

    /**
     * 捕获自定义异常，按照自定义返回信息
     * @param e
     * @return
     */
    @ResponseBody
    @ExceptionHandler(value = DiscoveryException.class)
    public Map<String,Object> errorHandle(DiscoveryException e){
        Arrays.stream(e.getStackTrace()).forEach(p->{
            if(StringUtil.isLocalHH(p.getClassName())) {
                log.error(p.getClassName() + "--- 截断行：" + p.getLineNumber());
            }
        });
        String message = e.getMessage();
        /**
         * 不暴露SQL提示给前端
         */
        if(StringUtil.contains(message, Constants.SQL_EXCEPTION)) {
            message = "获取数据失败！";
        }
        return AjaxResult.error(e.getCode(),e.getMsg());
    }

    /**
     * 捕获未知异常 返回 500
     * @param e
     * @return
     */
    @ResponseBody
    @ExceptionHandler(value = Exception.class)
    public AjaxResult errorHandle(Exception e){
        Arrays.stream(e.getStackTrace()).forEach(p->{
            if(StringUtil.isLocalHH(p.getClassName())) {
                log.error(p.getClassName() + "--- 截断行：" + p.getLineNumber());
            }
        });
        e.getStackTrace();
        String message = e.getMessage();
        /**
         * 不暴露SQL提示给前端
         */
        if(StringUtil.contains(message, Constants.SQL_EXCEPTION)) {
            message = "获取数据失败！";
        }
        return AjaxResult.error(message);
    }

}